package com.situ.mall.common.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.situ.mall.common.entity.Member;
import com.situ.mall.common.exception.MyException;
import com.situ.mall.common.mapper.MemberMapper;
import com.situ.mall.common.service.IMemberService;
import com.situ.mall.common.util.RequestUtil;
import com.situ.mall.common.util.StringUtil;
import com.situ.mall.common.vo.TableVO;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author JavaWizard
 * @since 2023-09-19
 */
@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements IMemberService {

/* 前端请求 */
    //登陆验证
    @Override
    public boolean check(String memberName, String password) {
        //先拿着用户名去数据库查用户
        Member m = baseMapper.selectByMemberName(memberName);
        //查不到，说明用户名都不对
        if (m == null){
            throw new MyException("用户名错误");
        }
        //两个条件必须同时满足
        //如果能查到用户,把传过来的密码进行加密，与根据用户名查到的加密后的密码进行比较
        boolean b = m != null && m.getPassword().equals(StringUtil.md5(password));
        //如果b为true，用户名和密码都正确，打上标记，登录
        if (b) {
            //把当前用户对象，保存进session
            RequestUtil.setCurrent(m);
            RequestUtil.getSession().setAttribute("currentId", m.getId());
        //如果b为false，提示密码错误
        }else {
            throw new MyException("密码错误");
        }
        return b;
    }

    //注册保存
    @Override
    public void register(String memberName, String password, String tel) {
        //先拿着用户名去数据库查用户
        Member m = baseMapper.selectByMemberName(memberName);
        //能查到，说明用户名重复，报错
        if (m != null){
            throw new MyException("用户名已被使用");
        }
        //给密码加密
        String password1 = StringUtil.md5(password);
        //上传加密后的密码
        baseMapper.register(memberName, password1, tel);
    }

    //查电话号码有没有被注册
    @Override
    public Member selectByTel(String tel) {
        return baseMapper.selectByTel(tel);
    }

    //修改个人资料
    @Override
    public Member selectByMemberId(Integer id) {
        return baseMapper.selectByMemberId(id);
    }

    //保存个人资料
    @Override
    public void saveMember(Member member) {
        //判断是否用户名重复
        Member m = baseMapper.selectByMemberName(member.getMemberName());
        //如果根据用户名查到了，说明用户名重复，不能添加用户
        if (m != null) {
            throw new MyException("用户名已经被使用");
        }
        //查电话号码长度是不是11位
        if (member.getTel().length() != 11) {
            throw new MyException("电话号码有误，请重新输入");
        }
        //查电话号码是不是0-9纯数字
        for (int i = 0; i < 11; i++) {
            char c = member.getTel().charAt(i);
            if (c < '0' || c > '9') {
                throw new MyException("电话号码有误，请重新输入");
            }
        }
        //如果没传状态码，指定状态码为0，放到里面
        if (member.getStatus() == null || member.getStatus().isEmpty()) {
            member.setStatus("0");
        }
        baseMapper.update(member);
    }


    /* 后端操作 */
    //查询渲染表格
    @Override
    public TableVO table(Integer page, Integer limit, String memberName, String tel) {
        //PageHelper 分页小工具
        PageHelper.startPage(page, limit);
        //上边这行代码后跟的第一次查数据库是分页查询，只生效一次！！！
        List<Member> list = baseMapper.list(memberName, tel);
        return TableVO.data(list);
    }

    //重置密码——根据ID查询旧密码带到前台
    @Override
    public String selectById(Integer id) {
        return baseMapper.selectById(id);
    }
}
